import Axios from 'axios'
import { BASE_URL } from './config'
import ElementUI from 'element-ui'
import router from '@/router'

const axios = Axios.create({
  baseURL: BASE_URL,
  withCredentials: true   // 允许凭证、发送cookies
})

axios.interceptors.request.use(
  config => {
    if(!config?.meta?.noAuth) {
      const Authorization = sessionStorage.getItem('Authorization')
      Authorization && (config.headers['Authorization'] = 'Bearer ' + sessionStorage.getItem('Authorization'))
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

axios.interceptors.response.use(
  response => {
    const { config: { url }, data, data: { code, message } } = response

    // file相关处理 -- Blob
    if(data instanceof Blob) {
      // 文件数据流
      if(data.type) {
        switch(data.type) {
          case 'application/octet-stream':
          case 'application/vnd.ms-excel':
            return response
        }
      }

      // 图片
      if(data.type && data.type.includes('image/')) {
        return response
      }

      // json -- 错误，需要将返回的Blob转化为JSON，再将错误信息输出
      if(data.type && data.type === 'application/json') {
        const reader  = new FileReader()
        reader.readAsText(data, 'utf-8')    // 读取文件,结果用字符串形式表示
        reader.onload = () => {             // 读取完成后,**获取reader.result**
          const  { errorMsg, data } = JSON.parse(reader.result)
          ElementUI.Message({ type: 'error', message: errorMsg || data })
        }
        return Promise.reject(data)
      }
    }

    switch(code) {
      case 401:
        ElementUI.Message({ type: 'error', message: `登录超时，请重新登录` })
        return Promise.reject(response)
      case 50000:
        ElementUI.Message({ type: 'error', message: message || `接口 [${url}] 错误`  })
        console.error(`请求错误相关信息:\n\n${ response }`)
        return Promise.reject(response)
      case 50001:
        ElementUI.Message({ type: 'error', message: message || `登录超时，请重新登录`  })
        // router.replace({ name: 'Login' })  // TODO：暂时注释，正式联调记得打开
        return Promise.reject(response)
    }
    return data
  },
  error => {

    const { config: { url, method }, status, message } = error.response || {}
    switch(status) {
      case 500:
        ElementUI.Message({ type: 'error', message: `接口 [${url}] 错误` })
        break
      case 401:
        ElementUI.Message({ type: 'error', message: `登录超时，请重新登录` })
        router.replace({ name: 'Login' })
        break
      case 403:
        ElementUI.Message({ type: 'error', message: `抱歉,您没有此权限` })
        break
      case 404:
        ElementUI.Message({ type: 'error', message: `接口 [${url}] 不存在` })
        break
      case 405:
        ElementUI.Message({ type: 'error', message: `请求方法[${method}]不支持` })
        break
      case 415:
        ElementUI.Message({ type: 'error', message: `请求的媒体类型不支持,415 Unsupported Media Type` })
        break
      default:
        ElementUI.Message({ type: 'error', message: error.message })
    }
    console.error(`请求错误相关信息:\n\n${ error }`)
    return Promise.reject(error)
  }
)


export default axios
